[404218]: / Code / Tensor Network vs FC Explainability / Dataset 3 / DS3 4TN TPU kkawchak.ipynb

Download this file

1263 lines (1263 with data), 122.6 kB

{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "machine_shape": "hm",
      "gpuType": "V28"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "TPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8XnVMPBXmtRa"
      },
      "source": [
        "# TensorNetworks in Neural Networks.\n",
        "\n",
        "Here, we have a small toy example of how to use a TN inside of a fully connected neural network.\n",
        "\n",
        "First off, let's install tensornetwork"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7HGRsYNAFxME"
      },
      "source": [
        "# !pip install tensornetwork\n",
        "\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import tensorflow as tf\n",
        "# Import tensornetwork\n",
        "import tensornetwork as tn\n",
        "import random\n",
        "import time\n",
        "import pandas as pd\n",
        "# Set the backend to tesorflow\n",
        "# (default is numpy)\n",
        "tn.set_default_backend(\"tensorflow\")\n",
        "np.random.seed(42)\n",
        "random.seed(42)\n",
        "tf.random.set_seed(42)\n",
        "# Explainability code assistance aided by ChatGPT3.5\n",
        "# 2021 Kelly, D. TensorFlow Explainable AI tutorial https://www.youtube.com/watch?v=6xePkn3-LME"
      ],
      "execution_count": 35,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "g1OMCo5XmrYu"
      },
      "source": [
        "# TensorNetwork layer definition\n",
        "\n",
        "Here, we define the TensorNetwork layer we wish to use to replace the fully connected layer. Here, we simply use a 2 node Matrix Product Operator network to replace the normal dense weight matrix.\n",
        "\n",
        "We TensorNetwork's NCon API to keep the code short."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wvSMKtPufnLp"
      },
      "source": [
        "class TNLayer(tf.keras.layers.Layer):\n",
        "\n",
        "  def __init__(self):\n",
        "    super(TNLayer, self).__init__()\n",
        "    # Create the variables for the layer.\n",
        "    self.a_var = tf.Variable(tf.random.normal(shape=(32, 32, 2),\n",
        "                                              stddev=1.0/32.0),\n",
        "                             name=\"a\", trainable=True)\n",
        "    self.b_var = tf.Variable(tf.random.normal(shape=(32, 32, 2),\n",
        "                                              stddev=1.0/32.0),\n",
        "                             name=\"b\", trainable=True)\n",
        "    self.bias = tf.Variable(tf.zeros(shape=(32, 32)),\n",
        "                            name=\"bias\", trainable=True)\n",
        "\n",
        "  def call(self, inputs):\n",
        "    # Define the contraction.\n",
        "    # We break it out so we can parallelize a batch using\n",
        "    # tf.vectorized_map (see below).\n",
        "    def f(input_vec, a_var, b_var, bias_var):\n",
        "      # Reshape to a matrix instead of a vector.\n",
        "      input_vec = tf.reshape(input_vec, (32, 32))\n",
        "\n",
        "      # Now we create the network.\n",
        "      a = tn.Node(a_var)\n",
        "      b = tn.Node(b_var)\n",
        "      x_node = tn.Node(input_vec)\n",
        "      a[1] ^ x_node[0]\n",
        "      b[1] ^ x_node[1]\n",
        "      a[2] ^ b[2]\n",
        "\n",
        "      # The TN should now look like this\n",
        "      #   |     |\n",
        "      #   a --- b\n",
        "      #    \\   /\n",
        "      #      x\n",
        "\n",
        "      # Now we begin the contraction.\n",
        "      c = a @ x_node\n",
        "      result = (c @ b).tensor\n",
        "\n",
        "      # To make the code shorter, we also could've used Ncon.\n",
        "      # The above few lines of code is the same as this:\n",
        "      # result = tn.ncon([x, a_var, b_var], [[1, 2], [-1, 1, 3], [-2, 2, 3]])\n",
        "\n",
        "      # Finally, add bias.\n",
        "      return result + bias_var\n",
        "\n",
        "    # To deal with a batch of items, we can use the tf.vectorized_map\n",
        "    # function.\n",
        "    # https://www.tensorflow.org/api_docs/python/tf/vectorized_map\n",
        "    result = tf.vectorized_map(\n",
        "        lambda vec: f(vec, self.a_var, self.b_var, self.bias), inputs)\n",
        "    return tf.nn.relu(tf.reshape(result, (-1, 1024)))"
      ],
      "execution_count": 36,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "V-CVqIhPnhY_"
      },
      "source": [
        "# Smaller model\n",
        "These two models are effectively the same, but notice how the TN layer has nearly 10x fewer parameters."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bbKsmK8wIFTp",
        "outputId": "e9317aa8-bb24-4ff8-f832-d694f1384ea5",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        }
      },
      "source": [
        "Dense = tf.keras.layers.Dense\n",
        "tn_model = tf.keras.Sequential(\n",
        "    [\n",
        "     tf.keras.Input(shape=(2,)),\n",
        "     Dense(1024, activation=tf.nn.relu),\n",
        "     # Start Modified Layers\n",
        "     TNLayer(),\n",
        "     TNLayer(),\n",
        "     TNLayer(),\n",
        "     TNLayer(),\n",
        "     # Finish Modified Layers\n",
        "     Dense(1, activation=None)])\n",
        "tn_model.summary()"
      ],
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Model: \"sequential_3\"\n",
            "_________________________________________________________________\n",
            " Layer (type)                Output Shape              Param #   \n",
            "=================================================================\n",
            " dense_6 (Dense)             (None, 1024)              3072      \n",
            "                                                                 \n",
            " tn_layer_12 (TNLayer)       (None, 1024)              5120      \n",
            "                                                                 \n",
            " tn_layer_13 (TNLayer)       (None, 1024)              5120      \n",
            "                                                                 \n",
            " tn_layer_14 (TNLayer)       (None, 1024)              5120      \n",
            "                                                                 \n",
            " tn_layer_15 (TNLayer)       (None, 1024)              5120      \n",
            "                                                                 \n",
            " dense_7 (Dense)             (None, 1)                 1025      \n",
            "                                                                 \n",
            "=================================================================\n",
            "Total params: 24577 (96.00 KB)\n",
            "Trainable params: 24577 (96.00 KB)\n",
            "Non-trainable params: 0 (0.00 Byte)\n",
            "_________________________________________________________________\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GWwoYp0WnsLA"
      },
      "source": [
        "# Training a model\n",
        "\n",
        "You can train the TN model just as you would a normal neural network model! Here, we give an example of how to do it in Keras."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qDFzOC7sDBJ-"
      },
      "source": [
        "# Generate points forming a spiral\n",
        "theta = np.linspace(0, 4*np.pi, 480)\n",
        "r = np.linspace(0, 1, 480)\n",
        "\n",
        "x = r * np.sin(theta)\n",
        "y = r * np.cos(theta)\n",
        "\n",
        "X = np.column_stack((x, y))\n",
        "Y = np.concatenate([np.ones((240)), -np.ones((240))])"
      ],
      "execution_count": 38,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since beginning of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "19TWP-1eKURB",
        "outputId": "cdd17b5e-9afb-4094-e15f-e319624880cc"
      },
      "execution_count": 39,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since beginning of run: 1712719027.3804047\n",
            "Wed Apr 10 03:17:07 2024\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "crc0q1vbIyTj",
        "outputId": "e13a7744-05d9-4962-d919-98dc61659179",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        }
      },
      "source": [
        "tn_model.compile(optimizer=\"adam\", loss=\"mean_squared_error\")\n",
        "tn_model.fit(X, Y, epochs=300, verbose=2)"
      ],
      "execution_count": 40,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/300\n",
            "15/15 - 2s - loss: 1.0017 - 2s/epoch - 122ms/step\n",
            "Epoch 2/300\n",
            "15/15 - 0s - loss: 1.0001 - 88ms/epoch - 6ms/step\n",
            "Epoch 3/300\n",
            "15/15 - 0s - loss: 1.0002 - 84ms/epoch - 6ms/step\n",
            "Epoch 4/300\n",
            "15/15 - 0s - loss: 1.0002 - 87ms/epoch - 6ms/step\n",
            "Epoch 5/300\n",
            "15/15 - 0s - loss: 1.0002 - 82ms/epoch - 5ms/step\n",
            "Epoch 6/300\n",
            "15/15 - 0s - loss: 1.0001 - 88ms/epoch - 6ms/step\n",
            "Epoch 7/300\n",
            "15/15 - 0s - loss: 1.0002 - 81ms/epoch - 5ms/step\n",
            "Epoch 8/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 9/300\n",
            "15/15 - 0s - loss: 1.0004 - 81ms/epoch - 5ms/step\n",
            "Epoch 10/300\n",
            "15/15 - 0s - loss: 1.0002 - 79ms/epoch - 5ms/step\n",
            "Epoch 11/300\n",
            "15/15 - 0s - loss: 1.0002 - 81ms/epoch - 5ms/step\n",
            "Epoch 12/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 13/300\n",
            "15/15 - 0s - loss: 1.0003 - 83ms/epoch - 6ms/step\n",
            "Epoch 14/300\n",
            "15/15 - 0s - loss: 1.0002 - 85ms/epoch - 6ms/step\n",
            "Epoch 15/300\n",
            "15/15 - 0s - loss: 1.0001 - 86ms/epoch - 6ms/step\n",
            "Epoch 16/300\n",
            "15/15 - 0s - loss: 1.0001 - 84ms/epoch - 6ms/step\n",
            "Epoch 17/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 18/300\n",
            "15/15 - 0s - loss: 1.0001 - 86ms/epoch - 6ms/step\n",
            "Epoch 19/300\n",
            "15/15 - 0s - loss: 1.0002 - 84ms/epoch - 6ms/step\n",
            "Epoch 20/300\n",
            "15/15 - 0s - loss: 1.0002 - 84ms/epoch - 6ms/step\n",
            "Epoch 21/300\n",
            "15/15 - 0s - loss: 1.0001 - 85ms/epoch - 6ms/step\n",
            "Epoch 22/300\n",
            "15/15 - 0s - loss: 1.0004 - 82ms/epoch - 5ms/step\n",
            "Epoch 23/300\n",
            "15/15 - 0s - loss: 1.0003 - 83ms/epoch - 6ms/step\n",
            "Epoch 24/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 25/300\n",
            "15/15 - 0s - loss: 1.0001 - 87ms/epoch - 6ms/step\n",
            "Epoch 26/300\n",
            "15/15 - 0s - loss: 1.0001 - 83ms/epoch - 6ms/step\n",
            "Epoch 27/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 28/300\n",
            "15/15 - 0s - loss: 1.0002 - 84ms/epoch - 6ms/step\n",
            "Epoch 29/300\n",
            "15/15 - 0s - loss: 1.0001 - 83ms/epoch - 6ms/step\n",
            "Epoch 30/300\n",
            "15/15 - 0s - loss: 1.0001 - 84ms/epoch - 6ms/step\n",
            "Epoch 31/300\n",
            "15/15 - 0s - loss: 1.0001 - 85ms/epoch - 6ms/step\n",
            "Epoch 32/300\n",
            "15/15 - 0s - loss: 1.0002 - 81ms/epoch - 5ms/step\n",
            "Epoch 33/300\n",
            "15/15 - 0s - loss: 1.0000 - 81ms/epoch - 5ms/step\n",
            "Epoch 34/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n",
            "Epoch 35/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 36/300\n",
            "15/15 - 0s - loss: 1.0001 - 84ms/epoch - 6ms/step\n",
            "Epoch 37/300\n",
            "15/15 - 0s - loss: 1.0002 - 84ms/epoch - 6ms/step\n",
            "Epoch 38/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 39/300\n",
            "15/15 - 0s - loss: 1.0002 - 85ms/epoch - 6ms/step\n",
            "Epoch 40/300\n",
            "15/15 - 0s - loss: 1.0001 - 83ms/epoch - 6ms/step\n",
            "Epoch 41/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 42/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 43/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 44/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 45/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 46/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 47/300\n",
            "15/15 - 0s - loss: 1.0002 - 82ms/epoch - 5ms/step\n",
            "Epoch 48/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 49/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 50/300\n",
            "15/15 - 0s - loss: 1.0002 - 78ms/epoch - 5ms/step\n",
            "Epoch 51/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 52/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 53/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 54/300\n",
            "15/15 - 0s - loss: 1.0000 - 80ms/epoch - 5ms/step\n",
            "Epoch 55/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 56/300\n",
            "15/15 - 0s - loss: 1.0002 - 83ms/epoch - 6ms/step\n",
            "Epoch 57/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 58/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 59/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 60/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 61/300\n",
            "15/15 - 0s - loss: 1.0002 - 82ms/epoch - 5ms/step\n",
            "Epoch 62/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 63/300\n",
            "15/15 - 0s - loss: 1.0000 - 80ms/epoch - 5ms/step\n",
            "Epoch 64/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 65/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 66/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 67/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 68/300\n",
            "15/15 - 0s - loss: 1.0002 - 78ms/epoch - 5ms/step\n",
            "Epoch 69/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 70/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 71/300\n",
            "15/15 - 0s - loss: 1.0001 - 75ms/epoch - 5ms/step\n",
            "Epoch 72/300\n",
            "15/15 - 0s - loss: 1.0005 - 80ms/epoch - 5ms/step\n",
            "Epoch 73/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 74/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 75/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 76/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n",
            "Epoch 77/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 78/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 79/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 80/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 81/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 82/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 83/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 84/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 85/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 86/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 87/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 88/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 89/300\n",
            "15/15 - 0s - loss: 1.0003 - 77ms/epoch - 5ms/step\n",
            "Epoch 90/300\n",
            "15/15 - 0s - loss: 1.0002 - 78ms/epoch - 5ms/step\n",
            "Epoch 91/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 92/300\n",
            "15/15 - 0s - loss: 1.0000 - 80ms/epoch - 5ms/step\n",
            "Epoch 93/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 94/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 95/300\n",
            "15/15 - 0s - loss: 1.0002 - 76ms/epoch - 5ms/step\n",
            "Epoch 96/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 97/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 98/300\n",
            "15/15 - 0s - loss: 1.0000 - 84ms/epoch - 6ms/step\n",
            "Epoch 99/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 100/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 101/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 102/300\n",
            "15/15 - 0s - loss: 1.0000 - 81ms/epoch - 5ms/step\n",
            "Epoch 103/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 104/300\n",
            "15/15 - 0s - loss: 1.0002 - 78ms/epoch - 5ms/step\n",
            "Epoch 105/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 106/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 107/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 108/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 109/300\n",
            "15/15 - 0s - loss: 1.0000 - 80ms/epoch - 5ms/step\n",
            "Epoch 110/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n",
            "Epoch 111/300\n",
            "15/15 - 0s - loss: 1.0002 - 76ms/epoch - 5ms/step\n",
            "Epoch 112/300\n",
            "15/15 - 0s - loss: 1.0003 - 79ms/epoch - 5ms/step\n",
            "Epoch 113/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 114/300\n",
            "15/15 - 0s - loss: 1.0000 - 81ms/epoch - 5ms/step\n",
            "Epoch 115/300\n",
            "15/15 - 0s - loss: 1.0000 - 84ms/epoch - 6ms/step\n",
            "Epoch 116/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 117/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 118/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 119/300\n",
            "15/15 - 0s - loss: 1.0000 - 81ms/epoch - 5ms/step\n",
            "Epoch 120/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 121/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 122/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 123/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n",
            "Epoch 124/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 125/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 126/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 127/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 128/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 129/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 130/300\n",
            "15/15 - 0s - loss: 1.0000 - 81ms/epoch - 5ms/step\n",
            "Epoch 131/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 132/300\n",
            "15/15 - 0s - loss: 1.0000 - 83ms/epoch - 6ms/step\n",
            "Epoch 133/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 134/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 135/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 136/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 137/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 138/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 139/300\n",
            "15/15 - 0s - loss: 1.0000 - 83ms/epoch - 6ms/step\n",
            "Epoch 140/300\n",
            "15/15 - 0s - loss: 1.0000 - 83ms/epoch - 6ms/step\n",
            "Epoch 141/300\n",
            "15/15 - 0s - loss: 1.0002 - 82ms/epoch - 5ms/step\n",
            "Epoch 142/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 143/300\n",
            "15/15 - 0s - loss: 1.0000 - 80ms/epoch - 5ms/step\n",
            "Epoch 144/300\n",
            "15/15 - 0s - loss: 1.0000 - 81ms/epoch - 5ms/step\n",
            "Epoch 145/300\n",
            "15/15 - 0s - loss: 1.0001 - 84ms/epoch - 6ms/step\n",
            "Epoch 146/300\n",
            "15/15 - 0s - loss: 1.0003 - 83ms/epoch - 6ms/step\n",
            "Epoch 147/300\n",
            "15/15 - 0s - loss: 1.0000 - 81ms/epoch - 5ms/step\n",
            "Epoch 148/300\n",
            "15/15 - 0s - loss: 1.0002 - 81ms/epoch - 5ms/step\n",
            "Epoch 149/300\n",
            "15/15 - 0s - loss: 1.0002 - 80ms/epoch - 5ms/step\n",
            "Epoch 150/300\n",
            "15/15 - 0s - loss: 1.0001 - 85ms/epoch - 6ms/step\n",
            "Epoch 151/300\n",
            "15/15 - 0s - loss: 1.0000 - 86ms/epoch - 6ms/step\n",
            "Epoch 152/300\n",
            "15/15 - 0s - loss: 1.0003 - 85ms/epoch - 6ms/step\n",
            "Epoch 153/300\n",
            "15/15 - 0s - loss: 1.0004 - 89ms/epoch - 6ms/step\n",
            "Epoch 154/300\n",
            "15/15 - 0s - loss: 1.0000 - 85ms/epoch - 6ms/step\n",
            "Epoch 155/300\n",
            "15/15 - 0s - loss: 1.0001 - 84ms/epoch - 6ms/step\n",
            "Epoch 156/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 157/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 158/300\n",
            "15/15 - 0s - loss: 1.0003 - 83ms/epoch - 6ms/step\n",
            "Epoch 159/300\n",
            "15/15 - 0s - loss: 1.0004 - 83ms/epoch - 6ms/step\n",
            "Epoch 160/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 161/300\n",
            "15/15 - 0s - loss: 1.0002 - 77ms/epoch - 5ms/step\n",
            "Epoch 162/300\n",
            "15/15 - 0s - loss: 1.0002 - 83ms/epoch - 6ms/step\n",
            "Epoch 163/300\n",
            "15/15 - 0s - loss: 1.0002 - 85ms/epoch - 6ms/step\n",
            "Epoch 164/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n",
            "Epoch 165/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 166/300\n",
            "15/15 - 0s - loss: 1.0002 - 82ms/epoch - 5ms/step\n",
            "Epoch 167/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 168/300\n",
            "15/15 - 0s - loss: 1.0002 - 86ms/epoch - 6ms/step\n",
            "Epoch 169/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 170/300\n",
            "15/15 - 0s - loss: 1.0003 - 81ms/epoch - 5ms/step\n",
            "Epoch 171/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 172/300\n",
            "15/15 - 0s - loss: 1.0001 - 75ms/epoch - 5ms/step\n",
            "Epoch 173/300\n",
            "15/15 - 0s - loss: 1.0000 - 76ms/epoch - 5ms/step\n",
            "Epoch 174/300\n",
            "15/15 - 0s - loss: 1.0001 - 72ms/epoch - 5ms/step\n",
            "Epoch 175/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 176/300\n",
            "15/15 - 0s - loss: 1.0001 - 83ms/epoch - 6ms/step\n",
            "Epoch 177/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 178/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n",
            "Epoch 179/300\n",
            "15/15 - 0s - loss: 1.0000 - 76ms/epoch - 5ms/step\n",
            "Epoch 180/300\n",
            "15/15 - 0s - loss: 1.0002 - 77ms/epoch - 5ms/step\n",
            "Epoch 181/300\n",
            "15/15 - 0s - loss: 1.0002 - 79ms/epoch - 5ms/step\n",
            "Epoch 182/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 183/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 184/300\n",
            "15/15 - 0s - loss: 1.0003 - 77ms/epoch - 5ms/step\n",
            "Epoch 185/300\n",
            "15/15 - 0s - loss: 1.0003 - 76ms/epoch - 5ms/step\n",
            "Epoch 186/300\n",
            "15/15 - 0s - loss: 1.0001 - 74ms/epoch - 5ms/step\n",
            "Epoch 187/300\n",
            "15/15 - 0s - loss: 1.0003 - 76ms/epoch - 5ms/step\n",
            "Epoch 188/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 189/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 190/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 191/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 192/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 193/300\n",
            "15/15 - 0s - loss: 1.0003 - 78ms/epoch - 5ms/step\n",
            "Epoch 194/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 195/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 196/300\n",
            "15/15 - 0s - loss: 1.0002 - 84ms/epoch - 6ms/step\n",
            "Epoch 197/300\n",
            "15/15 - 0s - loss: 1.0000 - 80ms/epoch - 5ms/step\n",
            "Epoch 198/300\n",
            "15/15 - 0s - loss: 1.0000 - 82ms/epoch - 5ms/step\n",
            "Epoch 199/300\n",
            "15/15 - 0s - loss: 1.0002 - 79ms/epoch - 5ms/step\n",
            "Epoch 200/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 201/300\n",
            "15/15 - 0s - loss: 1.0001 - 72ms/epoch - 5ms/step\n",
            "Epoch 202/300\n",
            "15/15 - 0s - loss: 1.0001 - 73ms/epoch - 5ms/step\n",
            "Epoch 203/300\n",
            "15/15 - 0s - loss: 1.0002 - 78ms/epoch - 5ms/step\n",
            "Epoch 204/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 205/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 206/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 207/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 208/300\n",
            "15/15 - 0s - loss: 1.0003 - 76ms/epoch - 5ms/step\n",
            "Epoch 209/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n",
            "Epoch 210/300\n",
            "15/15 - 0s - loss: 1.0002 - 78ms/epoch - 5ms/step\n",
            "Epoch 211/300\n",
            "15/15 - 0s - loss: 1.0002 - 75ms/epoch - 5ms/step\n",
            "Epoch 212/300\n",
            "15/15 - 0s - loss: 1.0001 - 75ms/epoch - 5ms/step\n",
            "Epoch 213/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 214/300\n",
            "15/15 - 0s - loss: 1.0000 - 81ms/epoch - 5ms/step\n",
            "Epoch 215/300\n",
            "15/15 - 0s - loss: 1.0001 - 82ms/epoch - 5ms/step\n",
            "Epoch 216/300\n",
            "15/15 - 0s - loss: 1.0000 - 84ms/epoch - 6ms/step\n",
            "Epoch 217/300\n",
            "15/15 - 0s - loss: 1.0001 - 86ms/epoch - 6ms/step\n",
            "Epoch 218/300\n",
            "15/15 - 0s - loss: 1.0000 - 81ms/epoch - 5ms/step\n",
            "Epoch 219/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n",
            "Epoch 220/300\n",
            "15/15 - 0s - loss: 1.0001 - 79ms/epoch - 5ms/step\n",
            "Epoch 221/300\n",
            "15/15 - 0s - loss: 1.0001 - 84ms/epoch - 6ms/step\n",
            "Epoch 222/300\n",
            "15/15 - 0s - loss: 1.0000 - 71ms/epoch - 5ms/step\n",
            "Epoch 223/300\n",
            "15/15 - 0s - loss: 1.0000 - 70ms/epoch - 5ms/step\n",
            "Epoch 224/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 225/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 226/300\n",
            "15/15 - 0s - loss: 1.0001 - 75ms/epoch - 5ms/step\n",
            "Epoch 227/300\n",
            "15/15 - 0s - loss: 1.0002 - 77ms/epoch - 5ms/step\n",
            "Epoch 228/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 229/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 230/300\n",
            "15/15 - 0s - loss: 1.0001 - 75ms/epoch - 5ms/step\n",
            "Epoch 231/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 232/300\n",
            "15/15 - 0s - loss: 1.0000 - 80ms/epoch - 5ms/step\n",
            "Epoch 233/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 234/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 235/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 236/300\n",
            "15/15 - 0s - loss: 1.0002 - 77ms/epoch - 5ms/step\n",
            "Epoch 237/300\n",
            "15/15 - 0s - loss: 1.0002 - 75ms/epoch - 5ms/step\n",
            "Epoch 238/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 239/300\n",
            "15/15 - 0s - loss: 1.0001 - 75ms/epoch - 5ms/step\n",
            "Epoch 240/300\n",
            "15/15 - 0s - loss: 1.0000 - 73ms/epoch - 5ms/step\n",
            "Epoch 241/300\n",
            "15/15 - 0s - loss: 1.0000 - 76ms/epoch - 5ms/step\n",
            "Epoch 242/300\n",
            "15/15 - 0s - loss: 1.0000 - 75ms/epoch - 5ms/step\n",
            "Epoch 243/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 244/300\n",
            "15/15 - 0s - loss: 1.0001 - 75ms/epoch - 5ms/step\n",
            "Epoch 245/300\n",
            "15/15 - 0s - loss: 1.0001 - 73ms/epoch - 5ms/step\n",
            "Epoch 246/300\n",
            "15/15 - 0s - loss: 1.0000 - 73ms/epoch - 5ms/step\n",
            "Epoch 247/300\n",
            "15/15 - 0s - loss: 1.0000 - 75ms/epoch - 5ms/step\n",
            "Epoch 248/300\n",
            "15/15 - 0s - loss: 1.0001 - 71ms/epoch - 5ms/step\n",
            "Epoch 249/300\n",
            "15/15 - 0s - loss: 1.0002 - 72ms/epoch - 5ms/step\n",
            "Epoch 250/300\n",
            "15/15 - 0s - loss: 1.0000 - 73ms/epoch - 5ms/step\n",
            "Epoch 251/300\n",
            "15/15 - 0s - loss: 1.0002 - 76ms/epoch - 5ms/step\n",
            "Epoch 252/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 253/300\n",
            "15/15 - 0s - loss: 1.0000 - 71ms/epoch - 5ms/step\n",
            "Epoch 254/300\n",
            "15/15 - 0s - loss: 1.0000 - 76ms/epoch - 5ms/step\n",
            "Epoch 255/300\n",
            "15/15 - 0s - loss: 1.0000 - 74ms/epoch - 5ms/step\n",
            "Epoch 256/300\n",
            "15/15 - 0s - loss: 1.0000 - 75ms/epoch - 5ms/step\n",
            "Epoch 257/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 258/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 259/300\n",
            "15/15 - 0s - loss: 1.0000 - 76ms/epoch - 5ms/step\n",
            "Epoch 260/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 261/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 262/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 263/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 264/300\n",
            "15/15 - 0s - loss: 1.0002 - 75ms/epoch - 5ms/step\n",
            "Epoch 265/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 266/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 267/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 268/300\n",
            "15/15 - 0s - loss: 1.0001 - 74ms/epoch - 5ms/step\n",
            "Epoch 269/300\n",
            "15/15 - 0s - loss: 1.0001 - 74ms/epoch - 5ms/step\n",
            "Epoch 270/300\n",
            "15/15 - 0s - loss: 1.0000 - 75ms/epoch - 5ms/step\n",
            "Epoch 271/300\n",
            "15/15 - 0s - loss: 1.0000 - 74ms/epoch - 5ms/step\n",
            "Epoch 272/300\n",
            "15/15 - 0s - loss: 1.0000 - 71ms/epoch - 5ms/step\n",
            "Epoch 273/300\n",
            "15/15 - 0s - loss: 1.0000 - 73ms/epoch - 5ms/step\n",
            "Epoch 274/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 275/300\n",
            "15/15 - 0s - loss: 1.0000 - 74ms/epoch - 5ms/step\n",
            "Epoch 276/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 277/300\n",
            "15/15 - 0s - loss: 1.0000 - 78ms/epoch - 5ms/step\n",
            "Epoch 278/300\n",
            "15/15 - 0s - loss: 1.0000 - 76ms/epoch - 5ms/step\n",
            "Epoch 279/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 280/300\n",
            "15/15 - 0s - loss: 1.0001 - 78ms/epoch - 5ms/step\n",
            "Epoch 281/300\n",
            "15/15 - 0s - loss: 1.0000 - 72ms/epoch - 5ms/step\n",
            "Epoch 282/300\n",
            "15/15 - 0s - loss: 1.0001 - 75ms/epoch - 5ms/step\n",
            "Epoch 283/300\n",
            "15/15 - 0s - loss: 1.0001 - 76ms/epoch - 5ms/step\n",
            "Epoch 284/300\n",
            "15/15 - 0s - loss: 1.0002 - 74ms/epoch - 5ms/step\n",
            "Epoch 285/300\n",
            "15/15 - 0s - loss: 1.0000 - 75ms/epoch - 5ms/step\n",
            "Epoch 286/300\n",
            "15/15 - 0s - loss: 1.0001 - 75ms/epoch - 5ms/step\n",
            "Epoch 287/300\n",
            "15/15 - 0s - loss: 1.0001 - 73ms/epoch - 5ms/step\n",
            "Epoch 288/300\n",
            "15/15 - 0s - loss: 1.0000 - 74ms/epoch - 5ms/step\n",
            "Epoch 289/300\n",
            "15/15 - 0s - loss: 1.0000 - 76ms/epoch - 5ms/step\n",
            "Epoch 290/300\n",
            "15/15 - 0s - loss: 1.0000 - 73ms/epoch - 5ms/step\n",
            "Epoch 291/300\n",
            "15/15 - 0s - loss: 1.0000 - 73ms/epoch - 5ms/step\n",
            "Epoch 292/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 293/300\n",
            "15/15 - 0s - loss: 1.0001 - 80ms/epoch - 5ms/step\n",
            "Epoch 294/300\n",
            "15/15 - 0s - loss: 1.0001 - 81ms/epoch - 5ms/step\n",
            "Epoch 295/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n",
            "Epoch 296/300\n",
            "15/15 - 0s - loss: 1.0000 - 77ms/epoch - 5ms/step\n",
            "Epoch 297/300\n",
            "15/15 - 0s - loss: 1.0001 - 77ms/epoch - 5ms/step\n",
            "Epoch 298/300\n",
            "15/15 - 0s - loss: 1.0000 - 80ms/epoch - 5ms/step\n",
            "Epoch 299/300\n",
            "15/15 - 0s - loss: 1.0000 - 75ms/epoch - 5ms/step\n",
            "Epoch 300/300\n",
            "15/15 - 0s - loss: 1.0000 - 79ms/epoch - 5ms/step\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<keras.src.callbacks.History at 0x7f9c4c3dc460>"
            ]
          },
          "metadata": {},
          "execution_count": 40
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "n-aNP4n3sqG_",
        "outputId": "9284ac22-8456-441f-8fb6-6618cf03c456",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 443
        }
      },
      "source": [
        "# Plotting code, feel free to ignore.\n",
        "h = 1.0\n",
        "x_min, x_max = X[:, 0].min() - 5, X[:, 0].max() + 5\n",
        "y_min, y_max = X[:, 1].min() - 5, X[:, 1].max() + 5\n",
        "xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n",
        "                     np.arange(y_min, y_max, h))\n",
        "\n",
        "# here \"model\" is your model's prediction (classification) function\n",
        "Z = tn_model.predict(np.c_[xx.ravel(), yy.ravel()])\n",
        "\n",
        "# Put the result into a color plot\n",
        "Z = Z.reshape(xx.shape)\n",
        "plt.contourf(xx, yy, Z)\n",
        "plt.axis('off')\n",
        "\n",
        "# Plot also the training points\n",
        "plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)"
      ],
      "execution_count": 41,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "5/5 [==============================] - 1s 4ms/step\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.collections.PathCollection at 0x7f9c3c5ce500>"
            ]
          },
          "metadata": {},
          "execution_count": 41
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since end of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "s_ukr55OORqE",
        "outputId": "18e5bc30-b6cf-4b32-f54c-5ecf204b80ca"
      },
      "execution_count": 42,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since end of run: 1712719054.2785194\n",
            "Wed Apr 10 03:17:34 2024\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since beginning of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "o8HTyvcHchzQ",
        "outputId": "065b6173-b534-4e44-955c-bb476b35630d"
      },
      "execution_count": 43,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since beginning of run: 1712719054.2845085\n",
            "Wed Apr 10 03:17:34 2024\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Function to compute saliency map\n",
        "@tf.function\n",
        "def compute_saliency(input_image):\n",
        "    with tf.GradientTape() as tape:\n",
        "        tape.watch(input_image)\n",
        "        predictions = tn_model(input_image)\n",
        "    grads = tape.gradient(predictions, input_image)\n",
        "    saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)\n",
        "    return saliency_map\n",
        "\n",
        "# Function to compute saliency map using Gradient\n",
        "@tf.function\n",
        "def compute_gradient_saliency(input_image):\n",
        "    with tf.GradientTape() as tape:\n",
        "        tape.watch(input_image)\n",
        "        predictions = tn_model(input_image)\n",
        "    grads = tape.gradient(predictions, input_image)\n",
        "    saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)\n",
        "    return saliency_map\n",
        "\n",
        "# Compute saliency map for the entire grid\n",
        "def compute_saliency_map_grid():\n",
        "    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
        "    input_image = np.c_[xx.ravel(), yy.ravel()]\n",
        "    saliency_map = compute_saliency(tf.constant(input_image, dtype=tf.float32)).numpy()\n",
        "    saliency_map = saliency_map.reshape(xx.shape)\n",
        "    return xx, yy, saliency_map\n",
        "\n",
        "# Compute and plot saliency map for the entire grid\n",
        "xx, yy, saliency_map = compute_saliency_map_grid()\n",
        "\n",
        "# Compute saliency maps for all data points\n",
        "def compute_saliency_maps():\n",
        "    saliency_maps = []\n",
        "    for data_point in X:\n",
        "        saliency_map = compute_gradient_saliency(tf.constant(data_point[None, :], dtype=tf.float32)).numpy()\n",
        "        saliency_maps.append(saliency_map)\n",
        "    return saliency_maps\n",
        "\n",
        "# Find the indices of the data points with the highest saliency values\n",
        "def find_top_indices(saliency_maps, top_k):\n",
        "    top_indices = np.argsort(np.max(saliency_maps, axis=1))[-top_k:]\n",
        "    return top_indices\n",
        "\n",
        "def plot_most_diagnostic(top_indices, top_k, normalized_saliency_values):\n",
        "    plt.figure(figsize=(8, 6))\n",
        "    plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)\n",
        "    plt.scatter(X[top_indices, 0], X[top_indices, 1], marker='o', s=200, facecolors='none', edgecolors='r', linewidths=2)\n",
        "    for i, index in enumerate(top_indices):\n",
        "        plt.annotate(f'{normalized_saliency_values.iloc[index][\"Saliency\"]:.4f}', (X[index, 0], X[index, 1]), xytext=(X[index, 0]+0.35, X[index, 1]+0.25), arrowprops=dict(facecolor='black', arrowstyle='->'))\n",
        "    plt.title(f'Saliency Most Diagnostic Data Points (Top {top_k})')\n",
        "    plt.xlabel('Feature 1')\n",
        "    plt.ylabel('Feature 2')\n",
        "    plt.grid(True)\n",
        "    plt.axis('equal')\n",
        "    plt.show()\n",
        "\n",
        "# Compute saliency maps for all data points\n",
        "saliency_maps = compute_saliency_maps()\n",
        "\n",
        "# Find the indices of the data points with the highest saliency values\n",
        "top_k = 5  # Number of top diagnostic data points to select\n",
        "top_indices = find_top_indices(saliency_maps, top_k)\n",
        "\n",
        "# Create a DataFrame to store the saliency values\n",
        "saliency_df = pd.DataFrame(data=saliency_maps, columns=[\"Saliency\"])\n",
        "\n",
        "# Save the saliency values to a CSV file\n",
        "saliency_df.to_csv(\"saliency_values.csv\", index=False)\n",
        "\n",
        "print(\"Saliency values saved to saliency_values.csv\")\n",
        "\n",
        "# Normalizing the saliency values\n",
        "normalized_saliency = (saliency_df - saliency_df.min()) / (saliency_df.max() - saliency_df.min())\n",
        "\n",
        "# Saving the normalized saliency values to a new CSV file\n",
        "normalized_saliency.to_csv(\"normalized_saliency_values.csv\", index=False)\n",
        "\n",
        "# Plot the most diagnostic data points\n",
        "plot_most_diagnostic(top_indices, top_k, normalized_saliency)\n",
        "\n",
        "print(\"Normalized saliency values saved to normalized_saliency_values.csv\")\n",
        "print(\"Normalized Saliency Top-k:\")\n",
        "print(normalized_saliency.nlargest(top_k, 'Saliency'))\n",
        "print(\"Normalized Saliency Max:\", normalized_saliency.max())\n",
        "print(\"Normalized Saliency Min:\", normalized_saliency.min())\n",
        "print(\"Normalized Saliency Mean:\", normalized_saliency.mean())\n",
        "print(\"Normalized Saliency Median:\", normalized_saliency.median())\n",
        "print(\"Normalized Saliency Mode:\", normalized_saliency.mode())\n",
        "sum_normalized_values = normalized_saliency.sum()\n",
        "print(\"Normalized Saliency Sum:\", sum_normalized_values)\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "print(\"Normalized Saliency Standard Deviation:\", normalized_saliency.std())\n",
        "print(\"Normalized Saliency Skewness:\", normalized_saliency.skew())\n",
        "print(\"Normalized Saliency Kurtosis:\", normalized_saliency.kurtosis())\n",
        "print(\"Normalized Saliency Variance:\", normalized_saliency.var())\n",
        "coefficient_variation = (normalized_saliency.std() / normalized_saliency.mean()) * 100\n",
        "print(\"Normalized Saliency Coefficient of Variation:\", coefficient_variation)\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "cumulative_sum = normalized_saliency.cumsum()\n",
        "print(\"Cumulative Sum of Normalized Saliency Values:\", cumulative_sum)\n",
        "mean_cumulative_sum = cumulative_sum / len(normalized_saliency)\n",
        "print(\"Mean of Cumulative Sum of Normalized Saliency Values:\", mean_cumulative_sum)\n",
        "rms = np.sqrt(np.mean(normalized_saliency**2))\n",
        "print(\"Normalized Saliency Root Mean Square:\", rms)\n",
        "q1 = normalized_saliency.quantile(0.25)\n",
        "q2 = normalized_saliency.quantile(0.75)\n",
        "iqr = q2 - q1\n",
        "print(\"Normalized Saliency 25th Percentile:\", q1)\n",
        "print(\"Normalized Saliency 75th Percentile:\", q2)\n",
        "print(\"Normalized Saliency Interquartile Range:\", iqr)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1904
        },
        "id": "95xed6YyDClf",
        "outputId": "37000960-83c2-40af-baa7-6aee1f5f045c"
      },
      "execution_count": 44,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Saliency values saved to saliency_values.csv\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x600 with 1 Axes>"
            ],
            "image/png": "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tB/LElH6S5lwbLPZLlrwAwCKi4sh+qkn+uyzz+LZZ5/t95jFixdHFf8gIhrL1MrowGrRqWDRRYfU8VmGPsdNtfe9EXliTvSUD1nRM0WCiCjZsTg8EREREVEYwzERERERURjDMRERERFRGMMxEREREVEYwzERERERURjDMRERERFRGMMxEREREVEYwzERERERURjDMRERERFRGMMxEREREVEYwzERERERURjDMRERERFRGMMxEREREVEYwzERERERUZgy0Q1IB0IIAIDT6UxwSwgA/H4/3G43nE4nVCpVoptDw4z9m77Yt+mN/ZveUqF/e3Nab267GIbjYdDZ2QkAKCwsTHBLiIiIiGggnZ2dsFgsF31eEpeKz3RJoVAI586dg8lkgiRJiW7OmOd0OlFYWIjTp0/DbDYnujk0zNi/6Yt9m97Yv+ktFfpXCIHOzk7k5+dDli8+s5gjx8NAlmUUFBQkuhn0FWazOWkvUBo69m/6Yt+mN/Zvekv2/h1oxLgXb8gjIiIiIgpjOCYiIiIiCmM4prSj0Wiwdu1aaDSaRDeFRgD7N32xb9Mb+ze9pVP/8oY8IiIiIqIwjhwTEREREYUxHBMRERERhTEcExERERGFMRwTEREREYUxHFNaeOaZZzB37lzo9XpYrdaYjhFCYM2aNcjLy4NOp8OCBQtw7NixkW0oxa21tRVLly6F2WyG1WrFAw88AJfLNeAxX/va1yBJUtTXQw89NEotpoFs2LABxcXF0Gq1qKiowM6dOwfc/w9/+AMmTZoErVaL6dOn44MPPhilltJgxNO/Gzdu7HOdarXaUWwtxWrr1q249dZbkZ+fD0mS8O67717ymM8++wxXXnklNBoNysrKsHHjxhFv53BhOKa04PP58M1vfhPf+973Yj7m+eefxyuvvILXX38dO3bsgMFgwKJFi9Dd3T2CLaV4LV26FIcOHUJVVRU2bdqErVu3YsWKFZc8bvny5WhoaIh8Pf/886PQWhrI73//e6xatQpr167F7t27MWPGDCxatAhNTU397v+3v/0Nd911Fx544AHs2bMHt99+O26//XYcPHhwlFtOsYi3f4GeamoXXqcnT54cxRZTrLq6ujBjxgxs2LAhpv3r6+tx88034/rrr8fevXuxcuVKPPjgg/joo49GuKXDRBClkTfeeENYLJZL7hcKhYTdbhcvvPBCZFt7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\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Normalized saliency values saved to normalized_saliency_values.csv\n",
            "Normalized Saliency Top-k:\n",
            "   Saliency\n",
            "0       NaN\n",
            "1       NaN\n",
            "2       NaN\n",
            "3       NaN\n",
            "4       NaN\n",
            "Normalized Saliency Max: Saliency   NaN\n",
            "dtype: float32\n",
            "Normalized Saliency Min: Saliency   NaN\n",
            "dtype: float32\n",
            "Normalized Saliency Mean: Saliency   NaN\n",
            "dtype: float32\n",
            "Normalized Saliency Median: Saliency   NaN\n",
            "dtype: float32\n",
            "Normalized Saliency Mode: Empty DataFrame\n",
            "Columns: [Saliency]\n",
            "Index: []\n",
            "Normalized Saliency Sum: Saliency    0.0\n",
            "dtype: float32\n",
            "#\n",
            "#\n",
            "#\n",
            "Normalized Saliency Standard Deviation: Saliency   NaN\n",
            "dtype: float32\n",
            "Normalized Saliency Skewness: Saliency   NaN\n",
            "dtype: float32\n",
            "Normalized Saliency Kurtosis: Saliency   NaN\n",
            "dtype: float32\n",
            "Normalized Saliency Variance: Saliency   NaN\n",
            "dtype: float32\n",
            "Normalized Saliency Coefficient of Variation: Saliency   NaN\n",
            "dtype: float32\n",
            "#\n",
            "#\n",
            "#\n",
            "Cumulative Sum of Normalized Saliency Values:      Saliency\n",
            "0         NaN\n",
            "1         NaN\n",
            "2         NaN\n",
            "3         NaN\n",
            "4         NaN\n",
            "..        ...\n",
            "475       NaN\n",
            "476       NaN\n",
            "477       NaN\n",
            "478       NaN\n",
            "479       NaN\n",
            "\n",
            "[480 rows x 1 columns]\n",
            "Mean of Cumulative Sum of Normalized Saliency Values:      Saliency\n",
            "0         NaN\n",
            "1         NaN\n",
            "2         NaN\n",
            "3         NaN\n",
            "4         NaN\n",
            "..        ...\n",
            "475       NaN\n",
            "476       NaN\n",
            "477       NaN\n",
            "478       NaN\n",
            "479       NaN\n",
            "\n",
            "[480 rows x 1 columns]\n",
            "Normalized Saliency Root Mean Square: nan\n",
            "Normalized Saliency 25th Percentile: Saliency   NaN\n",
            "Name: 0.25, dtype: float32\n",
            "Normalized Saliency 75th Percentile: Saliency   NaN\n",
            "Name: 0.75, dtype: float32\n",
            "Normalized Saliency Interquartile Range: Saliency   NaN\n",
            "dtype: float32\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since end of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "wfZCzuq9KY9b",
        "outputId": "39594baa-d5dc-4209-c228-5d7c3daa5ea8"
      },
      "execution_count": 45,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since end of run: 1712719055.9407122\n",
            "Wed Apr 10 03:17:35 2024\n"
          ]
        }
      ]
    }
  ]
}